package top.hudk.tank.utils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 作者：hudk
 * 时间：2021/9/12 15:11
 * 描述：线程池工具类
 */
public class ThreadPoolUtils {


    /**
     * 核心线程数，会一直存活，即使没有任务，线程池也会维护线程的最少数量
     */
    private static final int SIZE_CORE_POOL = 10;
    /**
     * 线程池维护线程的最大数量
     */
    private static final int SIZE_MAX_POOL = 200;
    /**
     * 线程池维护线程所允许的空闲时间
     */
    private static final long ALIVE_TIME = 2000;
    /**
     * 线程缓冲队列
     */
    private static BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(100);

    /**
     * 线程池
     */
    private static ThreadPoolExecutor pool =
            new ThreadPoolExecutor(SIZE_CORE_POOL,
                    SIZE_MAX_POOL,
                    ALIVE_TIME,
                    TimeUnit.MILLISECONDS,
                    bqueue,
                    new ThreadPoolExecutor.CallerRunsPolicy());

    static {
        //启动所有核心线程，导致它们空闲等待工作。
        pool.prestartAllCoreThreads();
    }

    /**
     * 执行线程任务
     * @param runnable 任务
     */
    public static void execute(Runnable runnable) {
         pool.execute(runnable);
    }

}
